/*
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-08-06 18:36:30
 * @LastEditTime: 2023-04-09 12:33:37
 * @LastEditors: 水冰淼
 */
/**
 * Created by hdz on 2019/3/26.
 */
import axios from 'axios'
import qs from 'qs'
// eslint-disable-next-line no-unused-vars
import Vue from 'vue'
import router from '../router'
// 域名
let baseUrl = ''
if (process.env.NODE_ENV === 'development') {
  baseUrl = '/api'
} else if (process.env.NODE_ENV === 'production') {
  baseUrl = 'http://112.126.100.206:8085'
  // baseUrl = 'http://39.105.63.194'
} else {
  baseUrl = 'http://112.126.100.206:8085'
}
// 超时时间为  ms*1000=s s * 60 分钟，就是2分钟
axios.defaults.timeout = 1000 * 60 * 2
axios.defaults.baseURL = baseUrl
// 此处是增加的代码，设置请求头的类型
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'

console.log(baseUrl)
axios.interceptors.request.use(
  config => {
    //  打开loadding
    //   config.headers['X-Token'] = getToken() // 让每个请求携带token--['X-Token']为自定义key 请根据实际情况自行修改
    // 判断为post请求，序列化传来的参数
    if (config.method === 'post' || config.method === 'put' || config.method === 'delete') {
      if (!(config.data instanceof FormData)) {
        // 如果不是通过FormData，因为FormData是文件上传不用序列化，其它就要序列化
        config.data = qs.stringify(config.data)
      }
    }
    return config
  }, error => {
    // 处理错误信息
    // alert(error.data.error.message)
    return Promise.reject(error)
  })

// 响应拦截器
axios.interceptors.response.use(res => {
  // 请求成功时要做的处理
  // 对响应数据做些事，把loading动画关掉
  // store.commit('CONTROL_LOADDING', false)
  const data = res.data
  // 对请求成功的值进行统一判断
  //   1.判空
  if (res.data === '' || res.data.length === 0 || res.data === 'undefined' || res.data === undefined) {
    console.log('后台传来的data为空/为undefined')
  }
  //   2.错误提示(前提是接口跑通了，只是对里边某些值做下详细判断。要先跟后台商定好，对某个固定的字段进行判断，并且确定固定字段来承接 错误信息，方便展示)
  if (+data.code === 200 || +data.code === 1000) {
    return res.data
  } else {
    // const message = data.msg || data.message || '后台接口错误'
    // console.log(Vue.prototype.$createToast, 'ttt')
    // Vue.prototype.$toast(message, 'error', 1000) // 不知道为何报错
    return Promise.reject(res)
  }
}, error => {
  // 请求错误时做些事(接口错误、超时等)

  // 关闭loadding
  // store.commit('CONTROL_LOADDING', false)
  console.log(error) // 打开控制台，可以看到error包含了几个对象:message, config, code, request, response,可以拿来请求超时等问题

  //  1.判断请求超时
  if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
    console.log('根据你设置的timeout/真的请求超时 判断请求现在超时了，你可以在这里加入超时的处理方案')
    // return service.request(originalRequest);//例如再重复请求一次
  }
  //  2.需要重定向到错误页面
  const errorInfo = error.response
  console.log(errorInfo)
  if (errorInfo) {
    // error =errorInfo.data//页面那边catch的时候就能拿到详细的错误信息,看最下边的Promise.reject
    if (errorInfo.status === 403) {
      router.push({
        path: '/error/403'
      })
    }
    // if (errorInfo.status === 500) {
    //   router.push({
    //     path: "/error/500"
    //   });
    // }
    // if (errorInfo.status === 502) {
    //   router.push({
    //     path: "/error/502"
    //   });
    // }
    if (errorInfo.status === 404) {
      router.push({
        path: '/error/404'
      })
    }
  }
  return Promise.reject(error) // 在调用的那边可以拿到(catch)你想返回的错误信息
})
/**
 * 封装get方法
 * @param url
 * @param data
 * @returns {Promise}
 */

export function get (url, params = {}) {
  return new Promise((resolve, reject) => {
    axios.get(url, {
      params: params
    }).then(response => {
      resolve(response)
    }).catch(err => {
      reject(err)
    })
  })
}

/**
 * 封装post请求
 * @param url
 * @param data
 * @returns {Promise}
 */
export function mypost (url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.post(url, data).then(response => {
      resolve(response.data)
    })
  })
}
export function post (url, data = {}, config = {}) {
  return new Promise((resolve, reject) => {
    axios.post(url, data, config).then(response => {
      resolve(response)
    },
    err => {
      reject(err)
    })
  })
}
/**
 * 封装patch请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function patch (url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.patch(url, data).then(response => {
      resolve(response.data)
    },
    err => {
      reject(err)
    })
  })
}

/**
 * 封装put请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function put (url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.put(url, data).then(response => {
      resolve(response)
    },
    err => {
      reject(err)
    })
  })
}

/**
 * 封装delete方法
 * @param url
 * @param data
 * @returns {Promise}
 */

export function deleteData (url, params = {}) {
  return new Promise((resolve, reject) => {
    axios.delete(url, {
      params: params
    }).then(response => {
      resolve(response)
    }).catch(err => {
      reject(err)
    })
  })
}
/**
 * 封装图片下载
 * @param url 图片地址
 * @param data
 * @returns {Promise}
 */

export function downloadImg (url, name, params = {}) {
  return axios.get(url, {
    params: params,
    responseType: 'blob' // 告诉服务器我们需要的响应格式
  })
    .then(res => {
      let blob = new Blob([res.data], {
        type: 'application/vnd.ms-image' // 将会被放入到blob中的数组内容的MIME类型
      })
      let fileName = name
      let link = document.createElement('a')
      link.href = window.URL.createObjectURL(blob)
      link.download = fileName
      link.click()
      window.URL.revokeObjectURL(link.href)
    })
    .catch(err => {
      console.log(err)
    })
}
